热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

笔者|本文_《flask》flask+mqtt联动快速上手

篇首语:本文由编程笔记#小编为大家整理,主要介绍了《flask》flask+mqtt联动快速上手相关的知识,希望对你有一定的参考价值。 简介 本文旨在介绍如何快速上手联动flask + mqt

篇首语:本文由编程笔记#小编为大家整理,主要介绍了《flask》flask+mqtt联动快速上手相关的知识,希望对你有一定的参考价值。



简介

本文旨在介绍如何快速上手联动flask + mqtt,本文将会给出一个简单的demo,用于演示在如何通过访问flask接口来触发mqtt,并在flask运行的基础的上对mqtt进行订阅。


快速上手

因为有项目需求,所以需要flask + mqtt进行联动,因为需要一直开启监听,所以需要一直挂在一个线程上,一开始想到用多线程做,或者说用异步协程来做,后来发现有一个关于flask的mqtt扩展库,因此为了快速上手,直接用该库进行开发,可以节省很多精力。

link: https://github.com/stlehmann/Flask-MQTT

首先,我们需要安装flask-mqtt库。

pip install flask-mqtt

下面放上一个简单的示例代码,里面包括了MQTT的订阅、发布,flask的访问。

"""
A small Test application to show how to use Flask-MQTT.
"""


import eventlet
from flask import Flask, render_template
from flask_mqtt import Mqtt


eventlet.monkey_patch()

app = Flask(__name__)
app.config['SECRET'] = 'my secret key'
app.config['TEMPLATES_AUTO_RELOAD'] = True
app.config['MQTT_BROKER_URL'] = 'broker.emqx.io'
app.config['MQTT_BROKER_PORT'] = 1883
app.config['MQTT_USERNAME'] = ''
app.config['MQTT_PASSWORD'] = ''
app.config['MQTT_KEEPALIVE'] = 5
app.config['MQTT_TLS_ENABLED'] = False
app.config['MQTT_CLEAN_SESSION'] = True


mqtt = Mqtt(app)


@app.route('/')
def index():
return "hello mqtt_flask"

@app.route('/hello')
def hello():
mqtt.publish('hello', 'hello, this is flask')
print("[mqtt] publish successfully")
return "publish successfully"

@mqtt.on_connect()
def handle_connect(client, userdata, flags, rc):
mqtt.subscribe('hello')
print("[mqtt] has listen topic hello")


@mqtt.on_message()
def handle_mqtt_message(client, userdata, message):
data = dict(
topic=message.topic,
payload=message.payload.decode()
)
print(data)

if __name__ == '__main__':
# important: Do not use reloader because this will create two Flask instances.
# Flask-MQTT only supports running with one instance # socketio.run(app, host='0.0.0.0', port=5000, use_reloader=False, debug=False) app.run()

订阅测试

这里用了MQTTX工具来进行测试,现在我已经连接到了一个MQTT服务器上,我将用MQTTX向该服务器发送一个topic为hello,payload为"msg": "Hello, This is mqtt server"的消息。

运行程序后,MQTTX发送消息,结果如下,可以看到,接收正常。


发布测试

现在我们访问http://localhost:5000/hello,flask服务器将会向我的MQTT服务器发送一个topic为hello,payload为"hello, this is flask"的消息,我们用MQTTX来监听。

从下图中可以看到,MQTTX成功订阅接收到了该消息,至此,关于FLASK+MQTT的必要流程已经可以走通了。


进一步测试

最初,笔者以为启动mqtt_client.loop_start()函数之后会线程堵塞,但是在使用 Paho MQTT Python 库时,调用 client.loop_start() 方法会在后台启动一个新线程,用于处理 MQTT 客户端的事件循环。这意味着您的代码不会堵塞,并且可以在 MQTT 客户端的事件循环运行时继续执行。

例如,您可以在调用 client.loop_start() 后使用以下代码继续执行其他操作:

import paho.mqtt.client as mqtt
# The callback for when a message is received from the server
def on_message(client, userdata, message):
print(f"Received message 'message.payload.decode()' on topic 'message.topic'")
# Create an MQTT client
client = mqtt.Client()
# Set the on_message callback
client.on_message = on_message
# Connect to the MQTT server
client.connect("mqtt.example.com", 1883, 60)
# Subscribe to a topic
client.subscribe("my/topic")
# Start the MQTT client loop in the background
client.loop_start()
# Do other work here
print("Doing other work")
# Wait for a while
time.sleep(10)
# Stop the MQTT client loop
client.loop_stop()

在上面的代码中,我们在调用 client.loop_start() 后立即执行了其他代码,然后等待了 10 秒钟。在这期间,MQTT 客户端的事件循环仍在后台运行,并等待接收消息。

基于此,那么flask和mqtt联动其实不用上述的扩展库也可以,笔者在paho官方的demo上小改一下,最后结果如下所示:

"""
访问 localhost:5000/hello时,会用mqtt客户端发布主题消息
"""

from flask import Flask, jsonify
import paho.mqtt.client as mqtt
import sys


app = Flask(__name__)
print('[app] start work', file=sys.stdout)


def connect_mqtt() -> mqtt:
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!", file=sys.stdout)
else:
print("Failed to connect, return code %d\\n", rc, file=sys.stdout)

client = mqtt.Client()
client.username_pw_set("", "")
client.on_connect = on_connect
client.connect("broker.emqx.io", 1883, 60)
return client


def subscribe(client: mqtt, topic):
def on_message(client, userdata, msg):
print(f"[mqtt] Received `msg.payload.decode()` from `msg.topic` topic", file=sys.stdout)

client.on_message = on_message
client.subscribe(topic)
print("[mqtt] subscribe topic")


client = connect_mqtt()
subscribe(client, "hello")
client.loop_start()

@app.route("/hello")
def alarm():
client.publish("hello", "important msg")
print("[mqtt] send msg successfully", file=sys.stdout)
return "Mqtt message published"


if __name__ == '__main__':
app.run()

该代码经本人实际测试,也是可以正常食用的。需要说明的是,如果你只是需要发布而不需要监听,那么client.loop_start()不是必要的。


推荐阅读
  • 本文介绍了如何使用Python的Paramiko库批量更新多台服务器的登录密码。通过示例代码展示了具体实现方法,确保了操作的高效性和安全性。Paramiko库提供了强大的SSH2协议支持,使得远程服务器管理变得更加便捷。此外,文章还详细说明了代码的各个部分,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • 普通树(每个节点可以有任意数量的子节点)级序遍历 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 通过将常用的外部命令集成到VSCode中,可以提高开发效率。本文介绍如何在VSCode中配置和使用自定义的外部命令,从而简化命令执行过程。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • 【实例简介】本文详细介绍了如何在PHP中实现微信支付的退款功能,并提供了订单创建类的完整代码及调用示例。在配置过程中,需确保正确设置相关参数,特别是证书路径应根据项目实际情况进行调整。为了保证系统的安全性,存放证书的目录需要设置为可读权限。值得注意的是,普通支付操作无需证书,但在执行退款操作时必须提供证书。此外,本文还对常见的错误处理和调试技巧进行了说明,帮助开发者快速定位和解决问题。 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • 多线程基础概览
    本文探讨了多线程的起源及其在现代编程中的重要性。线程的引入是为了增强进程的稳定性,确保一个进程的崩溃不会影响其他进程。而进程的存在则是为了保障操作系统的稳定运行,防止单一应用程序的错误导致整个系统的崩溃。线程作为进程的逻辑单元,多个线程共享同一CPU,需要合理调度以避免资源竞争。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • 命令模式是一种行为设计模式,它将请求封装成一个独立的对象,从而允许你参数化不同的请求、队列请求或者记录请求日志。本文将详细介绍命令模式的基本概念、组件及其在实际场景中的应用。 ... [详细]
  • Python多线程编程技巧与实战应用详解 ... [详细]
author-avatar
快乐生活HAPPY-GO
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有